package com.zjs.handleMvc.web.common;

import com.zjs.handleMvc.web.annotation.RequestMapping;
import com.zjs.handleMvc.web.annotation.ResponseBody;
import com.zjs.handleMvc.web.enumType.ResponseType;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 处理器映射器：url地址和唯一的一个Handler进行映射（Controller映射）
 */
public class HandlerMapping {
    //储存映射的map集合Map<url, Handler>
    private Map<String, Handler> mappings = new HashMap<String, Handler>();

    /**
     * 根据url地址获取唯一的一个Handler
     *
     * @param url
     * @return
     */
    public Handler getHandler(String url) {
        return mappings.get(url);
    }

    /**
     * 将请求处理映射规则保存到集合中
     */
    public void process(List<Object> beans) {
        for (Object bean : beans) {
            //通过反射获取到方法及对应的注解
            Class<?> beanClass = bean.getClass();
            //获取到类中所有的方法（包括私有的方法，但不包括超类的方法）
            Method[] methods = beanClass.getDeclaredMethods();
            for (Method method : methods) {
                //获取方法上的注解
                RequestMapping requestMapping = method.getDeclaredAnnotation(RequestMapping.class);
                if (requestMapping != null) {
                    //这个就是url值
                    String url = requestMapping.value();
                    //如果这个方法还带了@ResponseBody注解,则返回文本
                    ResponseBody responseBody = method.getDeclaredAnnotation(ResponseBody.class);
                    if (responseBody != null) {
                        mappings.put(url, new Handler(bean, method, ResponseType.TEXT));
                    } else {
                        mappings.put(url, new Handler(bean, method, ResponseType.VIEW));
                    }
                }
            }
        }
        System.out.println("映射Map-》:" + mappings);
    }
}
